﻿/*
Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.
For licensing, see LICENSE.html or http://ckeditor.com/license
*/

(function() {
   var a = CKEDITOR.htmlParser.fragment.prototype, 
   b = CKEDITOR.htmlParser.element.prototype; 
   a.onlyChild = b.onlyChild = function() {
      var k = this.children, 
      l = k.length, m = l == 1 && k[0]; 
      return m || null; 
      }; 
   b.removeAnyChildWithName = function(k) {
      var l = this.children, 
      m = [], n; 
      for(var o = 0; o < l.length; o++) {
         n = l[o]; 
         if(!n.name)continue; 
         if(n.name == k) {
            m.push(n); 
            l.splice(o--, 1); 
            }
         m = m.concat(n.removeAnyChildWithName(k)); 
         }
      return m; 
      }; 
   b.getAncestor = function(k) {
      var l = this.parent; 
      while(l &&!(l.name && l.name.match(k)))l = l.parent; 
      return l; 
      }; 
   a.firstChild = b.firstChild = function(k) {
      var l; 
      for(var m = 0; m < this.children.length; m++) {
         l = this.children[m]; 
         if(k(l))return l; 
         else if(l.name) {
            l = l.firstChild(k); 
            if(l)return l; 
            }
         }
      return null; 
      }; 
   b.addStyle = function(k, l, m) {
      var q = this; 
      var n, o = ''; 
      if(typeof l == 'string')o += k + ':' + l + ';'; 
      else {
         if(typeof k == 'object')for(var p in k) {
            if(k.hasOwnProperty(p))o += p + ':' + k[p] + ';'; 
            }
         else o += k; 
         m = l; 
         }
      if(!q.attributes)q.attributes = {
         }; 
      n = q.attributes.style || ''; 
      n = (m ? [o, n] : [n, o]).join(';'); 
      q.attributes.style = n.replace(/^;|;(?=;)/,'');
      }; 
   CKEDITOR.dtd.parentOf = function(k) {
      var l = {
         }; 
      for(var m in this) {
         if(m.indexOf('$') ==- 1 && this[m][k])l[m] = 1; 
         }
      return l; 
      }; 
   var c = /^([.\d]*)+(em|ex|px|gd|rem|vw|vh|vm|ch|mm|cm|in|pt|pc|deg|rad|ms|s|hz|khz){1}?/i, 
   d = /^(?:\b0[^\s]*\s*){1,4}$/, e = '^m{0,4}(cm|cd|d?c{0,3})(xc|xl|l?x{0,3})(ix|iv|v?i{0,3})$', f = new RegExp(e), g = new RegExp(e.toUpperCase()), h = 0, i; 
   CKEDITOR.plugins.pastefromword = {
      utils : {
         createListBulletMarker : function(k, 
         l) {
            var m = new CKEDITOR.htmlParser.element('cke:listbullet'), 
            n; 
            if(!k) {
               k = 'decimal'; 
               n = 'ol'; 
               }
            else if(k[2]) {
               if(!isNaN(k[1]))k = 'decimal'; 
               else if(f.test(k[1]))k = 'lower-roman'; 
               else if(g.test(k[1]))k = 'upper-roman'; 
               else if(/^[a-z]+$/.test(k[1]))k='lower-alpha';
               else if(/^[A-Z]+$/.test(k[1]))k='upper-alpha';
               else k = 'decimal'; 
               n = 'ol'; 
               }
            else {
               if(/[l\u00B7\u2002]/.test(k[1]))k='disc';
               else if(/[\u006F\u00D8]/.test(k[1]))k='circle';
               else if(/[\u006E\u25C6]/.test(k[1]))k='square';
               else k = 'disc'; 
               n = 'ul'; 
               }
            m.attributes = {
               'cke:listtype': n, 
               style : 'list-style-type:' + k + ';'}; 
            m.add(new CKEDITOR.htmlParser.text(l)); 
            return m; 
            }
         , isListBulletIndicator : function(k) {
            var l = k.attributes && k.attributes.style; 
            if(/mso-list\s*:\s*Ignore/i.test(l))return true;
            }
         , isContainingOnlySpaces : function(k) {
            var l; 
            return(l = k.onlyChild()) &&/^(:?\s| )+$/.test(l.value); 
            }
         , resolveList : function(k) {
            var l = k.attributes, 
            m; 
            if((m = k.removeAnyChildWithName('cke:listbullet')) && m.length && (m = m[0])) {
               k.name = 'cke:li'; 
               if(l.style)l.style = CKEDITOR.plugins.pastefromword.filters.stylesFilter([['text-indent'], 
               ['line-height'], 
               [/^margin(:?-left)?$/,null,function(p){var q=p.split(' '); p=CKEDITOR.plugins.pastefromword.utils.convertToPx(q[3]||q[1]||q[0]);p=parseInt(p,10);if(!h&&i&&p>i)h=p-i;l['cke:margin']=i=p;}]])(l.style,k)||'';
               var n = m.attributes, 
               o = n.style; 
               k.addStyle(o); 
               CKEDITOR.tools.extend(l, 
               n); 
               return true; 
               }
            return false; 
            }
         , convertToPx : (function() {
            var k = CKEDITOR.dom.element.createFromHtml('<div style="position:absolute;left:-9999px;top:-9999px;margin:0px;padding:0px;border:0px;"></div>', 
            CKEDITOR.document); CKEDITOR.document.getBody().append(k); return function(l) {
               if(c.test(l)) {
                  k.setStyle('width', 
                  l); return k.$.clientWidth + 'px'; }
               return l; }; }
         )(), getStyleComponents : (function() {
            var k = CKEDITOR.dom.element.createFromHtml('<div style="position:absolute;left:-9999px;top:-9999px;"></div>', 
            CKEDITOR.document); CKEDITOR.document.getBody().append(k); return function(l, 
            m, n) {
               k.setStyle(l, m); var o = {
                  }
               , p = n.length; for(var q = 0; q < p; q++)o[n[q]] = k.getStyle(n[q]); return o; }; }
         )(), listDtdParents : CKEDITOR.dtd.parentOf('ol')}
      , filters : {
         flattenList : function(k) {
            var l = k.attributes, 
            m = k.parent, n, o = 1; 
            while(m) {
               m.attributes && m.attributes['cke:list'] && o++; 
               m = m.parent; 
               }
            switch(l.type) {
               case 'a': n = 'lower-alpha'; 
               break; 
               }
            var p = k.children, 
            q; 
            for(var r = 0; r < p.length; r++) {
               q = p[r]; 
               var s = q.attributes; 
               if(q.name in CKEDITOR.dtd.$listItem) {
                  var t = q.children, 
                  u = t.length, 
                  v = t[u - 1]; 
                  if(v.name in CKEDITOR.dtd.$list) {
                     p.splice(r + 1, 
                     0, 
                     v); 
                     v.parent = k; 
                     if(!--t.length)p.splice(r, 
                     1); 
                     }
                  q.name = 'cke:li'; 
                  s['cke:indent'] = o; 
                  i = 0; 
                  s['cke:listtype'] = k.name; 
                  n && q.addStyle('list-style-type', 
                  n, 
                  true); 
                  }
               }
            delete k.name; 
            l['cke:list'] = 1; 
            }
         , assembleList : function(k) {
            var l = k.children, 
            m, n, o, p, q, r, s, t, u; 
            for(var v = 0; v < l.length; v++) {
               m = l[v]; 
               if('cke:li' == m.name) {
                  m.name = 'li'; 
                  n = m; 
                  o = n.attributes; 
                  p = n.attributes['cke:listtype']; 
                  q = parseInt(o['cke:indent'], 
                  10) || h && Math.ceil(o['cke:margin']/h)||1;
                  o.style && (o.style = CKEDITOR.plugins.pastefromword.filters.stylesFilter([['list-style-type', 
                  p == 'ol' ? 'decimal': 'disc']])(o.style) || ''); 
                  if(!s) {
                     s = new CKEDITOR.htmlParser.element(p); 
                     s.add(n); 
                     l[v] = s; 
                     }
                  else {
                     if(q > u) {
                        s = new CKEDITOR.htmlParser.element(p); 
                        s.add(n); 
                        r.add(s); 
                        }
                     else if(q < u) {
                        var w = u - q, 
                        x; 
                        while(w--&& (x = s.parent))s = x.parent; 
                        s.add(n); 
                        }
                     else s.add(n); 
                     l.splice(v--, 
                     1); 
                     }
                  r = n; 
                  u = q; 
                  }
               else s = null; 
               }
            h = 0; 
            }
         , falsyFilter : function(k) {
            return false; 
            }
         , stylesFilter : function(k, l) {
            return function(m, 
            n) {
               var o = []; 
               m.replace(/"/g,'"').replace(/\s*([^ :;]+)\s*:\s*([^;]+)\s*(?=;|$)/g,function(q,r,s){r=r.toLowerCase();r=='font-family'&&(s=s.replace(/["']/g,''));var t,u,v,w;for(var x=0;x               for(var p = 0; p < o.length; p++)o[p] = o[p].join(':'); 
               return o.length ? o.join(';') + ';': false; 
               }; 
            }
         , elementMigrateFilter : function(k, l) {
            return function(m) {
               var n = l ? new CKEDITOR.style(k, 
               l)._.definition : k; 
               m.name = n.element; 
               CKEDITOR.tools.extend(m.attributes, 
               CKEDITOR.tools.clone(n.attributes)); 
               m.addStyle(CKEDITOR.style.getStyleText(n)); 
               }; 
            }
         , styleMigrateFilter : function(k, l) {
            var m = this.elementMigrateFilter; 
            return function(n, 
            o) {
               var p = new CKEDITOR.htmlParser.element(null), 
               q = {
                  }; 
               q[l] = n; 
               m(k, q)(p); 
               p.children = o.children; 
               o.children = [p]; 
               }; 
            }
         , bogusAttrFilter : function(k, l) {
            if(l.name.indexOf('cke:') ==- 1)return false; 
            }
         , applyStyleFilter : null}
      , getRules : function(k) {
         var l = CKEDITOR.dtd, 
         m = CKEDITOR.tools.extend( {
            }
         , l.$block, l.$listItem, l.$tableContent), n = k.config, o = this.filters, p = o.falsyFilter, q = o.stylesFilter, r = o.elementMigrateFilter, s = CKEDITOR.tools.bind(this.filters.styleMigrateFilter, this.filters), t = this.utils.createListBulletMarker, u = o.flattenList, v = o.assembleList, w = this.utils.isListBulletIndicator, x = this.utils.isContainingOnlySpaces, y = this.utils.resolveList, z = this.utils.convertToPx, A = this.utils.getStyleComponents, B = this.utils.listDtdParents, C = n.pasteFromWordRemoveFontStyles !== false, D = n.pasteFromWordRemoveStyles !== false; 
         return {
            elementNames : [[/meta|link|script/, 
            '']], 
            root : function(E) {
               E.filterChildren(); 
               v(E); 
               }
            , elements : {
               '^': function(E) {
                  var F; 
                  if(CKEDITOR.env.gecko && (F = o.applyStyleFilter))F(E); 
                  }
               , $ : function(E) {
                  var F = E.name || '', 
                  G = E.attributes; 
                  if(F in m && G.style)G.style = q([[/^(:?width|height)$/,null,z]])(G.style)||'';
                  if(F.match(/h\d/)){E.filterChildren();
                  if(y(E))return; 
                  r(n['format_' + F])(E); 
                  }
               else if(F in l.$inline) {
                  E.filterChildren(); 
                  if(x(E))delete E.name; 
                  }
               else if(F.indexOf(':') !=- 1 && F.indexOf('cke') ==- 1) {
                  E.filterChildren(); 
                  if(F == 'v:imagedata') {
                     var H = E.attributes['o:href']; 
                     if(H)E.attributes.src = H; 
                     E.name = 'img'; 
                     return; 
                     }
                  delete E.name; 
                  }
               if(F in B) {
                  E.filterChildren(); 
                  v(E); 
                  }
               }
            , style : function(E) {
               if(CKEDITOR.env.gecko) {
                  var F = E.onlyChild().value.match(/\/\* Style Definitions \*\/([\s\S]*?)\/\*/),G=F&&F[1],H={};
                  if(G) {
                     G.replace(/[\n\r]/g,'').replace(/(.+?)\{(.+?)\}/g,function(I,J,K){J=J.split(',');var L=J.length,M;for(var N=0;N                     o.applyStyleFilter = function(I) {
                        var J = H['*'] ? '*': I.name, 
                        K = I.attributes && I.attributes['class'], 
                        L; 
                        if(J in H) {
                           L = H[J]; 
                           if(typeof L == 'object')L = L[K]; 
                           L && I.addStyle(L, 
                           true); 
                           }
                        }; 
                     }
                  }
               return false; 
               }
            , p : function(E) {
               E.filterChildren(); 
               if(y(E))return; 
               if(n.enterMode == CKEDITOR.ENTER_BR) {
                  delete E.name; 
                  E.add(new CKEDITOR.htmlParser.element('br')); 
                  }
               else r(n['format_' + (n.enterMode == CKEDITOR.ENTER_P ? 'p': 'div')])(E); 
               }
            , div : function(E) {
               var F = E.onlyChild(); 
               if(F && F.name == 'table') {
                  var G = E.attributes; 
                  F.attributes = CKEDITOR.tools.extend(F.attributes, 
                  G); 
                  G.style && F.addStyle(G.style); 
                  var H = new CKEDITOR.htmlParser.element('div'); 
                  H.addStyle('clear', 
                  'both'); 
                  E.add(H); 
                  delete E.name; 
                  }
               }
            , td : function(E) {
               if(E.getAncestor('thead'))E.name = 'th'; 
               }
            , ol : u, ul : u, dl : u, font : function(E) {
               if(!CKEDITOR.env.gecko && w(E.parent)) {
                  delete E.name; 
                  return; 
                  }
               E.filterChildren(); 
               var F = E.attributes, 
               G = F.style, H = E.parent; 
               if('font' == H.name) {
                  CKEDITOR.tools.extend(H.attributes, 
                  E.attributes); 
                  G && H.addStyle(G); 
                  delete E.name; 
                  }
               else {
                  G = G || ''; 
                  if(F.color) {
                     F.color != '#000000' && (G += 'color:' + F.color + ';'); 
                     delete F.color; 
                     }
                  if(F.face) {
                     G += 'font-family:' + F.face + ';'; 
                     delete F.face; 
                     }
                  if(F.size) {
                     G += 'font-size:' + (F.size > 3 ? 'large': F.size < 3 ? 'small': 'medium') + ';'; 
                     delete F.size; 
                     }
                  E.name = 'span'; 
                  E.addStyle(G); 
                  }
               }
            , span : function(E) {
               if(!CKEDITOR.env.gecko && w(E.parent))return false; 
               E.filterChildren(); 
               if(x(E)) {
                  delete E.name; 
                  return null; 
                  }
               if(!CKEDITOR.env.gecko && w(E)) {
                  var F = E.firstChild(function(M) {
                     return M.value || M.name == 'img'; }
                  ), 
                  G = F && (F.value || 'l.'), 
                  H = G.match(/^([^\s]+?)([.)]?)$/); 
                  return t(H, 
                  G); 
                  }
               var I = E.children, 
               J = E.attributes, 
               K = J && J.style, 
               L = I && I[0]; 
               if(K)J.style = q([['line-height'], 
               [/^font-family$/,null,!C?s(n.font_style,'family'):null],[/^font-size$/,null,!C?s(n.fontSize_style,'size'):null],[/^color$/,null,!C?s(n.colorButton_foreStyle,'color'):null],[/^background-color$/,null,!C?s(n.colorButton_backStyle,'color'):null]])(K,E)||'';
               return null; 
               }
            , b : r(n.coreStyles_bold), i : r(n.coreStyles_italic), u : r(n.coreStyles_underline), s : r(n.coreStyles_strike), sup : r(n.coreStyles_superscript), sub : r(n.coreStyles_subscript), a : function(E) {
               var F = E.attributes; 
               if(F &&!F.href && F.name)delete E.name; 
               }
            , 'cke:listbullet': function(E) {
               if(E.getAncestor(/h\d/)&&!n.pasteFromWordNumberedHeadingToList)delete E.name;
               }
            }
         , attributeNames : [[/^onmouse(:?out|over)/, ''], [/^onload$/, ''], [/(?:v|o):\w+/, ''], [/^lang/, '']], attributes : {
            style : q(D ? [[/^margin$|^margin-(?!bottom|top)/,null,function(E,F,G){if(F.name in {p:1,div:1}){var H=n.contentsLangDirection=='ltr'?'margin-left':'margin-right';if(G=='margin')E=A(G,E,[H])[H];else if(G!=H)return null;if(E&&!d.test(E))return[H,E];}return null;}],[/^clear$/],[/^border.*|margin.*|vertical-align|float$/,null,function(E,F){if(F.name=='img')return E; }],[/^width|height$/,null,function(E,F){if(F.name in {table:1,td:1,th:1,img:1})return E;}]]:[[/^mso-/],[/-color$/,null,function(E){if(E=='transparent')return false;if(CKEDITOR.env.gecko)return E.replace(/-moz-use-text-color/g,'transparent');}],[/^margin$/,d],['text-indent','0cm'],['page-break-before'],['tab-stops'],['display','none'],C?[/font-?/]:null],D),width:function(E,F){if(F.name in l.$tableContent)return false;
            }
         , border : function(E, F) {
            if(F.name in l.$tableContent)return false; 
            }
         , 'class': p, bgcolor : p, valign : D ? p : function(E, F) {
            F.addStyle('vertical-align', 
            E); 
            return false; 
            }
         }
      , comment :!CKEDITOR.env.ie ? function(E, F) {
         var G = E.match(//),H=E.match(/^\[if !supportLists\]([\s\S]*?)\[endif\]$/);
         if(H) {
            var I = H[1] || G && 'l.', 
            J = I && I.match(/>([^\s]+?)([.)]?)            return t(J, 
            I); 
            }
         if(CKEDITOR.env.gecko && G) {
            var K = CKEDITOR.htmlParser.fragment.fromHtml(G[0]).children[0], 
            L = F.previous, M = L && L.value.match(/]*o:href=['"](.*?)['"]/),N=M&&M[1];
            N && (K.attributes.src = N); 
            return K; 
            }
         return false; 
         }
      : p}; 
   }
}; 
var j = function() {
this.dataFilter = new CKEDITOR.htmlParser.filter(); 
}; 
j.prototype = {
toHtml : function(k) {
   var l = CKEDITOR.htmlParser.fragment.fromHtml(k, 
   false), m = new CKEDITOR.htmlParser.basicWriter(); 
   l.writeHtml(m, this.dataFilter); 
   return m.getHtml(true); 
   }
}; 
CKEDITOR.cleanWord = function(k, l) {
if(CKEDITOR.env.gecko)k = k.replace(/(([\S\s]*?))/gi,'$1$2$3');
var m = new j(), n = m.dataFilter; 
n.addRules(CKEDITOR.plugins.pastefromword.getRules(l)); 
l.fire('beforeCleanWord', {
   filter : n}
); 
try {
   k = m.toHtml(k, false); 
   }
catch(o) {
   alert(l.lang.pastefromword.error); 
   }
k = k.replace(/cke:.*?".*?"/g,'');
k = k.replace(/style=""/g,'');
k = k.replace(//g,'');
return k; 
}; 
}
)(); 